/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package CONTROLADOR;

import ANALISIS.AnalizadorLexico;
import VISTA.Frm_AnalizadorLexico;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;

/**
 *
 * @author CiberPulpo
 */
public class JControlador implements ActionListener {

    private Frm_AnalizadorLexico Frm_AnalizadorLexico = new Frm_AnalizadorLexico();

    public enum Accion {

        Amenu_abrir,
        Amenu_guardar,
        Amenu_salir,
        Amenu_compilar,
        Abtn_compilar
    }

    public JControlador(JFrame padre) {
        this.Frm_AnalizadorLexico = (Frm_AnalizadorLexico) padre;
    }

    public void iniciar() {
        this.Frm_AnalizadorLexico.setLocationRelativeTo(null);
        this.Frm_AnalizadorLexico.setTitle("PROYECTO COMPILADOR UNICA - Analizador Léxico");
        this.Frm_AnalizadorLexico.setVisible(true);
        this.Frm_AnalizadorLexico.getContentPane().setBackground(Color.getColor(""));
        btnimg_escalable(Frm_AnalizadorLexico.btncompilar, "/IMG/comp.png", 28, 223);


        /*Frm_AnalizadorLexico.java*/
        //menu
        this.Frm_AnalizadorLexico.menu_abrir.setActionCommand("Amenu_abrir");
        this.Frm_AnalizadorLexico.menu_abrir.addActionListener(this);
        //menu
        this.Frm_AnalizadorLexico.menu_guardar.setActionCommand("Amenu_guardar");
        this.Frm_AnalizadorLexico.menu_guardar.addActionListener(this);
        //menu
        this.Frm_AnalizadorLexico.menu_salir.setActionCommand("Amenu_salir");
        this.Frm_AnalizadorLexico.menu_salir.addActionListener(this);
        //menu
        this.Frm_AnalizadorLexico.menu_compilar.setActionCommand("Amenu_compilar");
        this.Frm_AnalizadorLexico.menu_compilar.addActionListener(this);
        //boton
        this.Frm_AnalizadorLexico.btncompilar.setActionCommand("Abtn_compilar");
        this.Frm_AnalizadorLexico.btncompilar.addActionListener(this);

    }

    private void compilar() {
        AnalizadorLexico AnalizadorLexico = new AnalizadorLexico(Frm_AnalizadorLexico.txtarea_ingresar.getText().toString());
        Frm_AnalizadorLexico.txtarea_resultado.setText(AnalizadorLexico.resultado);
        Frm_AnalizadorLexico.txtSintactico.setText(AnalizadorLexico.mensajeSintactico);
    }
    
    private void btnimg_escalable(JButton boton, String url, int ancho, int alto) {
        ImageIcon iconoOriginal = new ImageIcon(getClass().getResource(url));
        ImageIcon iconoEscala = new ImageIcon(iconoOriginal.getImage().getScaledInstance(ancho, alto, java.awt.Image.SCALE_DEFAULT));
        boton.setIcon(iconoEscala);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        switch (JControlador.Accion.valueOf(e.getActionCommand())) {
            case Amenu_abrir:
                JFileChooser jArchivos = new JFileChooser();
                jArchivos.setFileFilter(new FileNameExtensionFilter(".unica Lenguaje UNICA", "unica", "UNICA"));
                jArchivos.setDialogTitle("Abrir...");
                int result = jArchivos.showOpenDialog(null);
                if (result == JFileChooser.APPROVE_OPTION) {
                    File archivo = jArchivos.getSelectedFile();
                    String TextoArchivo = "";
                    try {
                        FileReader fr = new FileReader(archivo);
                        Scanner scan = new Scanner(fr);

                        while (scan.hasNextLine()) {
                            TextoArchivo = TextoArchivo + scan.nextLine() + "\n";
                        }
                        scan.close();
                        fr.close();
                    } catch (FileNotFoundException ex) {
                        JOptionPane.showMessageDialog(null, "Error al abrir el archivo", "ERROR Opps!", JOptionPane.ERROR_MESSAGE);
                    } catch (IOException ex) {
                        JOptionPane.showMessageDialog(null, "Error al leer al archivo", "ERROR Opps!", JOptionPane.ERROR_MESSAGE);
                    }
                    Frm_AnalizadorLexico.txtarea_ingresar.setText(TextoArchivo);
                }
                break;
            case Amenu_guardar:
                String texto = Frm_AnalizadorLexico.txtarea_ingresar.getText();//variable para comparacion
                if (texto.matches("[[ ]*[\n]*[\t]]*")) {//compara si en el JTextArea hay texto sino muestrtra un mensaje en pantalla
                    JOptionPane.showMessageDialog(null, "No hay texto para guardar!", "ERROR Opps!", JOptionPane.ERROR_MESSAGE);
                } else {
                    JFileChooser fileChooser = new JFileChooser();
                    fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("todos los archivos *.UNICA", "unica", "UNICA"));//filtro para ver solo archivos .unica
                    int seleccion = fileChooser.showSaveDialog(null);
                    try {
                        if (seleccion == JFileChooser.APPROVE_OPTION) {//comprueba si ha presionado el boton de aceptar
                            File JFC = fileChooser.getSelectedFile();
                            String PATH = JFC.getAbsolutePath();//obtenemos el path del archivo a guardar
                            PrintWriter printwriter = new PrintWriter(JFC);
                            printwriter.print(texto);//escribe en el archivo todo lo que se encuentre en el JTextArea
                            printwriter.close();//cierra el archivo
                            //comprobamos si a la hora de guardar obtuvo la extension y si no se la asignamos
                            if (!(PATH.endsWith(".unica"))) {
                                File temp = new File(PATH + ".unica");
                                JFC.renameTo(temp);//renombramos el archivo
                            }
                            JOptionPane.showMessageDialog(null, "Guardado exitoso!", "EXITOSO!", JOptionPane.INFORMATION_MESSAGE);
                        }
                    } catch (Exception ex) {//por alguna excepcion salta un mensaje de error
                        JOptionPane.showMessageDialog(null, "Error al guardar el archivo!", "Oops! Error", JOptionPane.ERROR_MESSAGE);
                    }
                }
                break;
            case Amenu_salir:
                int seleccion = JOptionPane.showOptionDialog(
                        null, // Componente padre
                        "¿Desea SALIR?", //Mensaje
                        "SALIR", // Título
                        JOptionPane.YES_NO_CANCEL_OPTION,
                        JOptionPane.INFORMATION_MESSAGE,
                        null, // null para icono por defecto.
                        new Object[]{"Si", "No"}, // null para YES, NO y CANCEL
                        "Si");
                if (seleccion != -1) {
                    if ((seleccion + 1) == 1) {
                        System.exit(0);
                    }
                }
                break;
            case Amenu_compilar:
                compilar();
                break;
            case Abtn_compilar:
                compilar();
                break;
        }
    }
}
